<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/kthread.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/kthread.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X0xJTlVYX0tUSFJFQURfSF8w"><span class="b">_LINUX_KTHREAD_H</span></a>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X0xJTlVYX0tUSFJFQURfSF8w"><span class="b">_LINUX_KTHREAD_H</span></a>
<a name="3" /><span class="True">       3:</span> <span class="k">/* Simple interface for creating and stopping kernel threads without mess. */</span>
<a name="4" /><span class="True">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">err</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="True">       5:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">sched</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="6" /><span class="True">       6:</span> 
<a name="7" /><span class="True">       7:</span> <a href="cpu.c_macros_ref.html#_X19wcmludGZfMA__"><span class="b">__printf</span></a><span class="f">(</span><span class="c">4</span><span class="f">,</span> <span class="c">5</span><span class="f">)</span>
<a name="8" /><span class="True">       8:</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">kthread_create_on_node</span><span class="f">(</span><span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">threadfn</span><span class="f">)</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">)</span><span class="f">,</span>
<a name="9" /><span class="True">       9:</span>                        <span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">,</span>
<a name="10" /><span class="True">      10:</span>                        <span class="m">int</span> <span class="b">node</span><span class="f">,</span>
<a name="11" /><span class="True">      11:</span>                        <span class="m">const</span> <span class="m">char</span> <span class="b">namefmt</span><span class="f">[</span><span class="f">]</span><span class="f">,</span> <span class="f">...</span><span class="f">)</span><span class="f">;</span>
<a name="12" /><span class="True">      12:</span> 
<a name="13" /><span class="True">      13:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_a3RocmVhZF9jcmVhdGVfMA__"><span class="b">kthread_create</span></a><span class="f">(</span><span class="b">threadfn</span><span class="f">,</span> <span class="b">data</span><span class="f">,</span> <span class="b">namefmt</span><span class="f">,</span> <span class="b">arg</span><span class="f">...</span><span class="f">)</span> \
<a name="14" /><span class="True">      14:</span>     <span class="b">kthread_create_on_node</span><span class="f">(</span><span class="b">threadfn</span><span class="f">,</span> <span class="b">data</span><span class="f">,</span> <span class="f">-</span><span class="c">1</span><span class="f">,</span> <span class="b">namefmt</span><span class="f">,</span> <span class="f">##</span><span class="b">arg</span><span class="f">)</span>
<a name="15" /><span class="True">      15:</span> 
<a name="16" /><span class="True">      16:</span> 
<a name="17" /><span class="True">      17:</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">kthread_create_on_cpu</span><span class="f">(</span><span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">threadfn</span><span class="f">)</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">)</span><span class="f">,</span>
<a name="18" /><span class="True">      18:</span>                       <span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">,</span>
<a name="19" /><span class="True">      19:</span>                       <span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu</span><span class="f">,</span>
<a name="20" /><span class="True">      20:</span>                       <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">namefmt</span><span class="f">)</span><span class="f">;</span>
<a name="21" /><span class="True">      21:</span> 
<a name="22" /><span class="True">      22:</span> <span class="k">/**</span>
<a name="23" /><span class="True">      23:</span> <span class="k"> * kthread_run - create and wake a thread.</span>
<a name="24" /><span class="True">      24:</span> <span class="k"> * @threadfn: the function to run until signal_pending(current).</span>
<a name="25" /><span class="True">      25:</span> <span class="k"> * @data: data ptr for @threadfn.</span>
<a name="26" /><span class="True">      26:</span> <span class="k"> * @namefmt: printf-style name for the thread.</span>
<a name="27" /><span class="True">      27:</span> <span class="k"> *</span>
<a name="28" /><span class="True">      28:</span> <span class="k"> * Description: Convenient wrapper for kthread_create() followed by</span>
<a name="29" /><span class="True">      29:</span> <span class="k"> * wake_up_process().  Returns the kthread or ERR_PTR(-ENOMEM).</span>
<a name="30" /><span class="True">      30:</span> <span class="k"> */</span>
<a name="31" /><span class="True">      31:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_a3RocmVhZF9ydW5fMA__"><span class="b">kthread_run</span></a><span class="f">(</span><span class="b">threadfn</span><span class="f">,</span> <span class="b">data</span><span class="f">,</span> <span class="b">namefmt</span><span class="f">,</span> <span class="f">...</span><span class="f">)</span>               \
<a name="32" /><span class="True">      32:</span> <span class="f">(</span><span class="f">{</span>                                       \
<a name="33" /><span class="True">      33:</span>     <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">__k</span>                           \
<a name="34" /><span class="True">      34:</span>         <span class="f">=</span> <a href="cpu.c_macros_noref.html#_a3RocmVhZF9jcmVhdGVfMA__"><span class="b">kthread_create</span></a><span class="f">(</span><span class="b">threadfn</span><span class="f">,</span> <span class="b">data</span><span class="f">,</span> <span class="b">namefmt</span><span class="f">,</span> <span class="f">##</span> <span class="b">__VA_ARGS__</span><span class="f">)</span><span class="f">;</span> \
<a name="35" /><span class="True">      35:</span>     <span class="m">if</span> <span class="f">(</span><span class="f">!</span><span class="b">IS_ERR</span><span class="f">(</span><span class="b">__k</span><span class="f">)</span><span class="f">)</span>                           \
<a name="36" /><span class="True">      36:</span>         <span class="b">wake_up_process</span><span class="f">(</span><span class="b">__k</span><span class="f">)</span><span class="f">;</span>                       \
<a name="37" /><span class="True">      37:</span>     <span class="b">__k</span><span class="f">;</span>                                   \
<a name="38" /><span class="True">      38:</span> <span class="f">}</span><span class="f">)</span>
<a name="39" /><span class="True">      39:</span> 
<a name="40" /><span class="True">      40:</span> <span class="m">void</span> <span class="b">kthread_bind</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">k</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="41" /><span class="True">      41:</span> <span class="m">int</span> <span class="b">kthread_stop</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">k</span><span class="f">)</span><span class="f">;</span>
<a name="42" /><span class="True">      42:</span> <span class="m">bool</span> <span class="b">kthread_should_stop</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="43" /><span class="True">      43:</span> <span class="m">bool</span> <span class="b">kthread_should_park</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="44" /><span class="True">      44:</span> <span class="m">bool</span> <span class="b">kthread_freezable_should_stop</span><span class="f">(</span><span class="m">bool</span> <span class="f">*</span><span class="b">was_frozen</span><span class="f">)</span><span class="f">;</span>
<a name="45" /><span class="True">      45:</span> <span class="m">void</span> <span class="f">*</span><span class="b">kthread_data</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">k</span><span class="f">)</span><span class="f">;</span>
<a name="46" /><span class="True">      46:</span> <span class="m">void</span> <span class="f">*</span><span class="b">probe_kthread_data</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">k</span><span class="f">)</span><span class="f">;</span>
<a name="47" /><span class="True">      47:</span> <span class="m">int</span> <span class="b">kthread_park</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">k</span><span class="f">)</span><span class="f">;</span>
<a name="48" /><span class="True">      48:</span> <span class="m">void</span> <span class="b">kthread_unpark</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">k</span><span class="f">)</span><span class="f">;</span>
<a name="49" /><span class="True">      49:</span> <span class="m">void</span> <span class="b">kthread_parkme</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="50" /><span class="True">      50:</span> 
<a name="51" /><span class="True">      51:</span> <span class="m">int</span> <span class="b">kthreadd</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">unused</span><span class="f">)</span><span class="f">;</span>
<a name="52" /><span class="True">      52:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">kthreadd_task</span><span class="f">;</span>
<a name="53" /><span class="True">      53:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">tsk_fork_get_node</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">tsk</span><span class="f">)</span><span class="f">;</span>
<a name="54" /><span class="True">      54:</span> 
<a name="55" /><span class="True">      55:</span> <span class="k">/*</span>
<a name="56" /><span class="True">      56:</span> <span class="k"> * Simple work processor based on kthread.</span>
<a name="57" /><span class="True">      57:</span> <span class="k"> *</span>
<a name="58" /><span class="True">      58:</span> <span class="k"> * This provides easier way to make use of kthreads.  A kthread_work</span>
<a name="59" /><span class="True">      59:</span> <span class="k"> * can be queued and flushed using queue/flush_kthread_work()</span>
<a name="60" /><span class="True">      60:</span> <span class="k"> * respectively.  Queued kthread_works are processed by a kthread</span>
<a name="61" /><span class="True">      61:</span> <span class="k"> * running kthread_worker_fn().</span>
<a name="62" /><span class="True">      62:</span> <span class="k"> */</span>
<a name="63" /><span class="True">      63:</span> <span class="m">struct</span> <span class="b">kthread_work</span><span class="f">;</span>
<a name="64" /><span class="True">      64:</span> <span class="m">typedef</span> <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">kthread_work_func_t</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">kthread_work</span> <span class="f">*</span><span class="b">work</span><span class="f">)</span><span class="f">;</span>
<a name="65" /><span class="True">      65:</span> 
<a name="66" /><span class="True">      66:</span> <span class="m">struct</span> <span class="b">kthread_worker</span> <span class="f">{</span>
<a name="67" /><span class="True">      67:</span>     <span class="b">spinlock_t</span>        <span class="b">lock</span><span class="f">;</span>
<a name="68" /><span class="True">      68:</span>     <span class="m">struct</span> <span class="b">list_head</span>    <span class="b">work_list</span><span class="f">;</span>
<a name="69" /><span class="True">      69:</span>     <span class="m">struct</span> <span class="b">task_struct</span>    <span class="f">*</span><span class="b">task</span><span class="f">;</span>
<a name="70" /><span class="True">      70:</span>     <span class="m">struct</span> <span class="b">kthread_work</span>    <span class="f">*</span><span class="b">current_work</span><span class="f">;</span>
<a name="71" /><span class="True">      71:</span> <span class="f">}</span><span class="f">;</span>
<a name="72" /><span class="True">      72:</span> 
<a name="73" /><span class="True">      73:</span> <span class="m">struct</span> <span class="b">kthread_work</span> <span class="f">{</span>
<a name="74" /><span class="True">      74:</span>     <span class="m">struct</span> <span class="b">list_head</span>    <span class="b">node</span><span class="f">;</span>
<a name="75" /><span class="True">      75:</span>     <span class="b">kthread_work_func_t</span>    <span class="b">func</span><span class="f">;</span>
<a name="76" /><span class="True">      76:</span>     <span class="b">wait_queue_head_t</span>    <span class="b">done</span><span class="f">;</span>
<a name="77" /><span class="True">      77:</span>     <span class="m">struct</span> <span class="b">kthread_worker</span>    <span class="f">*</span><span class="b">worker</span><span class="f">;</span>
<a name="78" /><span class="True">      78:</span> <span class="f">}</span><span class="f">;</span>
<a name="79" /><span class="True">      79:</span> 
<a name="80" /><span class="True">      80:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_S1RIUkVBRF9XT1JLRVJfSU5JVF8w"><span class="b">KTHREAD_WORKER_INIT</span></a><span class="f">(</span><span class="b">worker</span><span class="f">)</span>    <span class="f">{</span>                \
<a name="81" /><span class="True">      81:</span>     <span class="f">.</span><span class="b">lock</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_X19TUElOX0xPQ0tfVU5MT0NLRURfMA__"><span class="b">__SPIN_LOCK_UNLOCKED</span></a><span class="f">(</span><span class="f">(</span><span class="b">worker</span><span class="f">)</span><span class="f">.</span><span class="b">lock</span><span class="f">)</span><span class="f">,</span>            \
<a name="82" /><span class="True">      82:</span>     <span class="f">.</span><span class="b">work_list</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TElTVF9IRUFEX0lOSVRfMA__"><span class="b">LIST_HEAD_INIT</span></a><span class="f">(</span><span class="f">(</span><span class="b">worker</span><span class="f">)</span><span class="f">.</span><span class="b">work_list</span><span class="f">)</span><span class="f">,</span>        \
<a name="83" /><span class="True">      83:</span>     <span class="f">}</span>
<a name="84" /><span class="True">      84:</span> 
<a name="85" /><span class="True">      85:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_S1RIUkVBRF9XT1JLX0lOSVRfMA__"><span class="b">KTHREAD_WORK_INIT</span></a><span class="f">(</span><span class="b">work</span><span class="f">,</span> <span class="b">fn</span><span class="f">)</span>    <span class="f">{</span>                \
<a name="86" /><span class="True">      86:</span>     <span class="f">.</span><span class="b">node</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TElTVF9IRUFEX0lOSVRfMA__"><span class="b">LIST_HEAD_INIT</span></a><span class="f">(</span><span class="f">(</span><span class="b">work</span><span class="f">)</span><span class="f">.</span><span class="b">node</span><span class="f">)</span><span class="f">,</span>                \
<a name="87" /><span class="True">      87:</span>     <span class="f">.</span><span class="b">func</span> <span class="f">=</span> <span class="f">(</span><span class="b">fn</span><span class="f">)</span><span class="f">,</span>                            \
<a name="88" /><span class="True">      88:</span>     <span class="f">.</span><span class="b">done</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_X19XQUlUX1FVRVVFX0hFQURfSU5JVElBTElaRVJfMA__"><span class="b">__WAIT_QUEUE_HEAD_INITIALIZER</span></a><span class="f">(</span><span class="f">(</span><span class="b">work</span><span class="f">)</span><span class="f">.</span><span class="b">done</span><span class="f">)</span><span class="f">,</span>        \
<a name="89" /><span class="True">      89:</span>     <span class="f">}</span>
<a name="90" /><span class="True">      90:</span> 
<a name="91" /><span class="True">      91:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVGSU5FX0tUSFJFQURfV09SS0VSXzA_"><span class="b">DEFINE_KTHREAD_WORKER</span></a><span class="f">(</span><span class="b">worker</span><span class="f">)</span>                    \
<a name="92" /><span class="True">      92:</span>     <span class="m">struct</span> <span class="b">kthread_worker</span> <span class="b">worker</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_S1RIUkVBRF9XT1JLRVJfSU5JVF8w"><span class="b">KTHREAD_WORKER_INIT</span></a><span class="f">(</span><span class="b">worker</span><span class="f">)</span>
<a name="93" /><span class="True">      93:</span> 
<a name="94" /><span class="True">      94:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVGSU5FX0tUSFJFQURfV09SS18w"><span class="b">DEFINE_KTHREAD_WORK</span></a><span class="f">(</span><span class="b">work</span><span class="f">,</span> <span class="b">fn</span><span class="f">)</span>                    \
<a name="95" /><span class="True">      95:</span>     <span class="m">struct</span> <span class="b">kthread_work</span> <span class="b">work</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_S1RIUkVBRF9XT1JLX0lOSVRfMA__"><span class="b">KTHREAD_WORK_INIT</span></a><span class="f">(</span><span class="b">work</span><span class="f">,</span> <span class="b">fn</span><span class="f">)</span>
<a name="96" /><span class="True">      96:</span> 
<a name="97" /><span class="True">      97:</span> <span class="k">/*</span>
<a name="98" /><span class="True">      98:</span> <span class="k"> * kthread_worker.lock and kthread_work.done need their own lockdep class</span>
<a name="99" /><span class="True">      99:</span> <span class="k"> * keys if they are defined on stack with lockdep enabled.  Use the</span>
<a name="100" /><span class="True">     100:</span> <span class="k"> * following macros when defining them on stack.</span>
<a name="101" /><span class="True">     101:</span> <span class="k"> */</span>
<a name="102" /><span class="False">     102:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_LOCKDEP</span>
<a name="103" /><span class="False">     103:</span> <span class="f">#</span> <span class="n">define</span> <span class="b">KTHREAD_WORKER_INIT_ONSTACK</span><span class="f">(</span><span class="b">worker</span><span class="f">)</span>                \
<a name="104" /><span class="False">     104:</span>     <span class="f">(</span><span class="f">{</span> <a href="cpu.c_macros_noref.html#_aW5pdF9rdGhyZWFkX3dvcmtlcl8w"><span class="b">init_kthread_worker</span></a><span class="f">(</span><span class="f">&amp;</span><span class="b">worker</span><span class="f">)</span><span class="f">;</span> <span class="b">worker</span><span class="f">;</span> <span class="f">}</span><span class="f">)</span>
<a name="105" /><span class="False">     105:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVGSU5FX0tUSFJFQURfV09SS0VSX09OU1RBQ0tfMA__"><span class="b">DEFINE_KTHREAD_WORKER_ONSTACK</span></a><span class="f">(</span><span class="b">worker</span><span class="f">)</span>                \
<a name="106" /><span class="False">     106:</span>     <span class="m">struct</span> <span class="b">kthread_worker</span> <span class="b">worker</span> <span class="f">=</span> <span class="b">KTHREAD_WORKER_INIT_ONSTACK</span><span class="f">(</span><span class="b">worker</span><span class="f">)</span>
<a name="107" /><span class="False">     107:</span> <span class="f">#</span> <span class="n">define</span> <span class="b">KTHREAD_WORK_INIT_ONSTACK</span><span class="f">(</span><span class="b">work</span><span class="f">,</span> <span class="b">fn</span><span class="f">)</span>                \
<a name="108" /><span class="False">     108:</span>     <span class="f">(</span><span class="f">{</span> <a href="cpu.c_macros_noref.html#_aW5pdF9rdGhyZWFkX3dvcmtfMA__"><span class="b">init_kthread_work</span></a><span class="f">(</span><span class="f">(</span><span class="f">&amp;</span><span class="b">work</span><span class="f">)</span><span class="f">,</span> <span class="b">fn</span><span class="f">)</span><span class="f">;</span> <span class="b">work</span><span class="f">;</span> <span class="f">}</span><span class="f">)</span>
<a name="109" /><span class="False">     109:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVGSU5FX0tUSFJFQURfV09SS19PTlNUQUNLXzA_"><span class="b">DEFINE_KTHREAD_WORK_ONSTACK</span></a><span class="f">(</span><span class="b">work</span><span class="f">,</span> <span class="b">fn</span><span class="f">)</span>                \
<a name="110" /><span class="False">     110:</span>     <span class="m">struct</span> <span class="b">kthread_work</span> <span class="b">work</span> <span class="f">=</span> <span class="b">KTHREAD_WORK_INIT_ONSTACK</span><span class="f">(</span><span class="b">work</span><span class="f">,</span> <span class="b">fn</span><span class="f">)</span>
<a name="111" /><span class="True">     111:</span> <span class="f">#</span><span class="n">else</span>
<a name="112" /><span class="True">     112:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVGSU5FX0tUSFJFQURfV09SS0VSX09OU1RBQ0tfMA__"><span class="b">DEFINE_KTHREAD_WORKER_ONSTACK</span></a><span class="f">(</span><span class="b">worker</span><span class="f">)</span> <a href="cpu.c_macros_noref.html#_REVGSU5FX0tUSFJFQURfV09SS0VSXzA_"><span class="b">DEFINE_KTHREAD_WORKER</span></a><span class="f">(</span><span class="b">worker</span><span class="f">)</span>
<a name="113" /><span class="True">     113:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVGSU5FX0tUSFJFQURfV09SS19PTlNUQUNLXzA_"><span class="b">DEFINE_KTHREAD_WORK_ONSTACK</span></a><span class="f">(</span><span class="b">work</span><span class="f">,</span> <span class="b">fn</span><span class="f">)</span> <a href="cpu.c_macros_noref.html#_REVGSU5FX0tUSFJFQURfV09SS18w"><span class="b">DEFINE_KTHREAD_WORK</span></a><span class="f">(</span><span class="b">work</span><span class="f">,</span> <span class="b">fn</span><span class="f">)</span>
<a name="114" /><span class="True">     114:</span> <span class="f">#</span><span class="n">endif</span>
<a name="115" /><span class="True">     115:</span> 
<a name="116" /><span class="True">     116:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__init_kthread_worker</span><span class="f">(</span><span class="m">struct</span> <span class="b">kthread_worker</span> <span class="f">*</span><span class="b">worker</span><span class="f">,</span>
<a name="117" /><span class="True">     117:</span>             <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">name</span><span class="f">,</span> <span class="m">struct</span> <span class="b">lock_class_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span><span class="f">;</span>
<a name="118" /><span class="True">     118:</span> 
<a name="119" /><span class="True">     119:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_aW5pdF9rdGhyZWFkX3dvcmtlcl8w"><span class="b">init_kthread_worker</span></a><span class="f">(</span><span class="b">worker</span><span class="f">)</span>                    \
<a name="120" /><span class="True">     120:</span>     <span class="m">do</span> <span class="f">{</span>                                \
<a name="121" /><span class="True">     121:</span>         <span class="m">static</span> <span class="m">struct</span> <span class="b">lock_class_key</span> <span class="b">__key</span><span class="f">;</span>            \
<a name="122" /><span class="True">     122:</span>         <span class="b">__init_kthread_worker</span><span class="f">(</span><span class="f">(</span><span class="b">worker</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;(&quot;</span><span class="f">#</span><span class="b">worker</span><span class="e">&quot;)-&gt;lock&quot;</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">__key</span><span class="f">)</span><span class="f">;</span> \
<a name="123" /><span class="True">     123:</span>     <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="124" /><span class="True">     124:</span> 
<a name="125" /><span class="True">     125:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_aW5pdF9rdGhyZWFkX3dvcmtfMA__"><span class="b">init_kthread_work</span></a><span class="f">(</span><span class="b">work</span><span class="f">,</span> <span class="b">fn</span><span class="f">)</span>                    \
<a name="126" /><span class="True">     126:</span>     <span class="m">do</span> <span class="f">{</span>                                \
<a name="127" /><span class="True">     127:</span>         <span class="b">memset</span><span class="f">(</span><span class="f">(</span><span class="b">work</span><span class="f">)</span><span class="f">,</span> <span class="c">0</span><span class="f">,</span> <span class="m">sizeof</span><span class="f">(</span><span class="m">struct</span> <span class="b">kthread_work</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>        \
<a name="128" /><span class="True">     128:</span>         <span class="b">INIT_LIST_HEAD</span><span class="f">(</span><span class="f">&amp;</span><span class="f">(</span><span class="b">work</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">node</span><span class="f">)</span><span class="f">;</span>                \
<a name="129" /><span class="True">     129:</span>         <span class="f">(</span><span class="b">work</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">func</span> <span class="f">=</span> <span class="f">(</span><span class="b">fn</span><span class="f">)</span><span class="f">;</span>                    \
<a name="130" /><span class="True">     130:</span>         <a href="cpu.c_macros_ref.html#_aW5pdF93YWl0cXVldWVfaGVhZF8w"><span class="b">init_waitqueue_head</span></a><span class="f">(</span><span class="f">&amp;</span><span class="f">(</span><span class="b">work</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">done</span><span class="f">)</span><span class="f">;</span>            \
<a name="131" /><span class="True">     131:</span>     <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="132" /><span class="True">     132:</span> 
<a name="133" /><span class="True">     133:</span> <span class="m">int</span> <span class="b">kthread_worker_fn</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">worker_ptr</span><span class="f">)</span><span class="f">;</span>
<a name="134" /><span class="True">     134:</span> 
<a name="135" /><span class="True">     135:</span> <span class="m">bool</span> <span class="b">queue_kthread_work</span><span class="f">(</span><span class="m">struct</span> <span class="b">kthread_worker</span> <span class="f">*</span><span class="b">worker</span><span class="f">,</span>
<a name="136" /><span class="True">     136:</span>             <span class="m">struct</span> <span class="b">kthread_work</span> <span class="f">*</span><span class="b">work</span><span class="f">)</span><span class="f">;</span>
<a name="137" /><span class="True">     137:</span> <span class="m">void</span> <span class="b">flush_kthread_work</span><span class="f">(</span><span class="m">struct</span> <span class="b">kthread_work</span> <span class="f">*</span><span class="b">work</span><span class="f">)</span><span class="f">;</span>
<a name="138" /><span class="True">     138:</span> <span class="m">void</span> <span class="b">flush_kthread_worker</span><span class="f">(</span><span class="m">struct</span> <span class="b">kthread_worker</span> <span class="f">*</span><span class="b">worker</span><span class="f">)</span><span class="f">;</span>
<a name="139" /><span class="True">     139:</span> 
<a name="140" /><span class="True">     140:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _LINUX_KTHREAD_H */</span>
<a name="141" /><span class="True">     141:</span> </pre>
  </body>
</html>
